// 通常项目里经常出现回调里面调用另外一个回调
// 代码就会出现大量嵌套
// 不美观 可读性也会差
// 随着调用次数的增加 嵌套的深度也更深
// 这就陷入了回调地域
// 举个例子

(() => {
  let count = 1;
  console.log('task' + count++);
  (() => {
    console.log('task' + count++);
    (() => {
      console.log('task' + count++);
      (() => {
        console.log('task' + count++);
        (() => {
          console.log('task' + count++);
        })();
      })();
    })();
  })();
})();

const fs = require('fs');

// promisify 可以将回调改写成链式调用
// promisfy工具方法让一个遵循通常的 Node.js 回调风格的函数， 即 (err, value) => ... 回调函数是最后一个参数, 返回一个返回值是一个 promise 版本的函数。
const promisify = require('util').promisify;

const read = promisify(fs.readFile);

read('./28-fs-promise-async-await.js').then(data => {
  console.log(data.toString());
}).catch(ex => {
  console.log(ex);
});

// asunc await 适合更加复杂的回调实现 -es7 - 需要较高的nodejs版本
// 它可以将 异步函数像普通函数那样去执行
async function testAsyncFunction () {
  try {
    const content = await read('./28-fs-promise-async-await.js');
    console.log(content.toString());
  } catch(e) {
    console.log(e.code, e.message);
  }
}

testAsyncFunction();